/*
 * @Author: OBKoro1
 * @Date: 2025-09-09 20:10:02
 * @LastEditTime: 2025-09-10 14:07:13
 * @FilePath: \Gating\main\main.c
 * @Description:
 *
 * Copyright (c) 2025 by ${git_name_email}, All Rights Reserved.
 */
#include <stdio.h>
#include "ble.h"
#include "gpio.h"
#include "wifi.h"
#include "freertos/semphr.h"
#include "nvs_flash.h"
#include "reset.h"
#include "nvs.h"
#include <esp_log.h>

static const char *TAG = "nvs_check";

// 检查指定命名空间是否有数据
bool nvs_namespace_has_data(const char* target_namespace) {
    nvs_handle_t handle;
    esp_err_t err;

    // 以只读模式打开目标命名空间
    err = nvs_open(target_namespace, NVS_READONLY, &handle);
    if (err != ESP_OK) {
        // 若命名空间不存在，直接返回false（无数据）
        if (err == ESP_ERR_NVS_NOT_FOUND) {
            ESP_LOGI(TAG, "命名空间 [%s] 不存在（无数据）", target_namespace);
            return false;
        }
        ESP_LOGE(TAG, "打开命名空间 [%s] 失败: %s", target_namespace, esp_err_to_name(err));
        return false;
    }

    // 查找该命名空间下的任意类型键值对
    nvs_iterator_t it = NULL;
    err = nvs_entry_find(NVS_DEFAULT_PART_NAME, target_namespace, NVS_TYPE_ANY, &it);

    // 无论是否找到，都要关闭句柄和释放迭代器
    nvs_close(handle);
    if (it != NULL) {
        nvs_release_iterator(it);
    }

    if (err == ESP_OK) {
        ESP_LOGI(TAG, "命名空间 [%s] 存在数据", target_namespace);
        return true;
    } else if (err == ESP_ERR_NVS_NOT_FOUND) {
        ESP_LOGI(TAG, "命名空间 [%s] 无数据", target_namespace);
        return false;
    } else {
        ESP_LOGE(TAG, "查找命名空间 [%s] 数据失败: %s", target_namespace, esp_err_to_name(err));
        return false;
    }
}
void app_main(void)
{
    // 初始化 NVS（整个上电周期只需一次）
    esp_err_t err = nvs_flash_init();
    if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        // 若 NVS 分区损坏或版本不兼容，擦除后重新初始化
        ESP_ERROR_CHECK(nvs_flash_erase());
        err = nvs_flash_init();
    }
    ESP_ERROR_CHECK(err);  // 确保初始化成功
    gpio_init();
    esp_netif_init();
    wifi_init();
    // ble_init();
    boot_input();
    // 检查默认命名空间是否有数据
    if (nvs_namespace_has_data(NVS_NAMESPACE)) {
        ESP_LOGI(TAG, "NVS中存在数据,不需要进行蓝牙初始化");
        printf("正在准备联网,等待WiFi连接...\n");
        set_wifi_sta();
        set_static_ip_sta();
    } else {
        ESP_LOGI(TAG, "NVS中没有数据,初始化蓝牙准备配网");
        ble_init();
    }
    
    
    // printf("Waiting for WiFi connection...\n");
    // 1. 创建二进制信号量（初始为“未释放”状态）
    // g_wifi_connected_sem = xSemaphoreCreateBinary();
    // assert(g_wifi_connected_sem != NULL);  // 确保信号量创建成功
    // if (g_wifi_connected_sem == NULL) { // 检查创建是否成功
    //     printf("信号量创建失败！（内存不足）");
    //     return; // 创建失败时退出，避免后续空指针调用
    // }

    printf("GPIO9: %s\n", gpio_get_level(POWER_KEY_GPIO) == 1 ? "HIGH" : "LOW");

    // 3. 阻塞等待 WiFi 连接成功（无限等待，直到信号量被释放）
    // xSemaphoreTake(g_wifi_connected_sem, portMAX_DELAY);
    printf("循环检测是否有初始化信号！\n");
    while(1) {
        if(gpio_get_level(POWER_KEY_GPIO) == 1) {
            check_power_key_reset();
        }
        
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
    // vSemaphoreDelete(g_wifi_connected_sem);
    // g_wifi_connected_sem = NULL;
    
}
